先前我們可以使用 docker compose up ,是因為他可以根據我本機的 Dockerfile 製成一顆 Image ,並使用 compose 啟動 app 與 db 兩個服務,我現在希望可以將這個我在本機運作的流程,搬到 EC2 (遠端) 來實作,如此一來,任何人只要有網址或 ip 地址,都可以透過在瀏覽器搜尋看到我的專案,也就是達成部署的效果。
在這之前我要在 EC2 裡面跑 Docker,所以我需要先連接到 EC2 以及 在 EC2 instance 裡下載 Docker。
什麼跟 AWS EC2 連接?為什麼要連接?🤯
其實說白話就是,建立我本機跟 AWS EC2 的網路連接。透過連接,使我們可以在 EC2 實例上進行遠端管理、部署應用程式、監控和維護等服務。
要連接到 AWS EC2 首先我們可以先勾選要連接的 instance ,接著點選 connect(連接) 按鈕
進到 connect 裡面,可以看到有很多種不同的連接方式,這邊就簡單介紹我最常用的兩種:
EC2 Instance Connect 使用 SSH 隧道協議,以安全的方式連接到 EC2 ,我們不需要自己管理 SSH 金鑰。我自己是想像成在 AWS 裡可以直接連到 EC2 的終端機。
選擇 EC2 Instance Connect 的 Tab ,直接點選右下角 connect ,可以看到開啟一個新的分頁如下圖是 AWS 裡,已經連到 EC2 的終端機,我們可以在這個終端機裡下指令。
我想像成我有一把鑰匙,可以使用 SSH 客戶端,連接到 AWS EC2 的終端機。
選擇 SSH client 的 Tab,可以看到這邊我們要使用的鑰匙,就是我們在開 instance 設定的密鑰 krystal.pem
,其實圖片就有說明步驟了,但我還是不完全了解他的意思,所以就先試再說!
首先打開終端機,在我終端機的根目錄(或是你習慣連接 EC2 的目錄),將我們先前收藏好的 krystal.pem
檔案拉到這個目錄下,並且執行連接看看 ssh -i "krystal.pem" ec2-user@ec2-52-199-213-167.ap-northeast-1.compute.amazonaws.com
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])?
會看到如上述的安全提醒,我就把它想像成驗證,所以直接輸入 yes 即可。
這時我看到了上方看起來明顯的警示,看起來他說我的 krystal.pem
太開放?!我猜想是權限的問題,所以將 Permissions 0644 for 'krystal.pem' are too open.
錯誤訊息去問問谷歌大神,第一個搜尋結果
看起來調整檔案權限即可
chmod 400 <檔案名稱>
偷偷說其實剛剛 AWS 第三點也有教我們怎麼做🤣🤣
沒有輸出是正常的,代表調整權限成功!
接著再一次執行 ssh 連線,看到這個奇怪的形狀就知道成功啦🥳
以下在 ECR 下載 Docker 我是參考 菜鳥工程師 肉豬 的文章
sudo yum update -y
這邊有個小提醒,主要是在說 Amazon Linux 有新版本,我可以使用 dnf upgrade --releasever=2023.2.20231002
來下載新版本
需要 superuser 才可以,所以我加上 sudo
下載過程太長了我就先省略,但中間可能會提問下載需要花費多少容量是否願意繼續更新這類的問題,成功了會出現 Complete!
字樣。
sudo yum install docker
一樣會問一些下載需要花費多少容量是否願意繼續下載這類的問題,成功了一樣會出現 Complete!
字樣。
docker --version
sudo usermod -a -G docker ec2-user
這個指令是將 ec2-user
這個使用者加到 docker 使用者,這樣可以獲得執行 Docker 操作的權限,就不需要每次都使用 sudo
。
📍這邊是因為 EC2 預設的 user 叫做 ec2-user
,但如果您想確認自己的名稱時,可以使用:
whoami
sudo service docker start
docker ps
使用出鏡率超高的 docker ps
但是卻看到
permission denied while trying to connect to the Docker daemon socket
看起來又是權限問題,但我剛剛不是 sudo usermod -a -G docker ec2-user
調整權限成功了嗎?
其實是因為當我調整權限成功,我需要先退出 ec2 instance ,再重新進來一次,就會將新的權限生效。
📍退出一樣使用之前教過的 control 鍵 + d 鍵
或輸入 exit 字 + enter 鍵
再次進去 instance 後,再試一次成功看到目前 docker ps
是空的
到這邊我們已經萬事俱備,明天就來從這個 EC2 的 instance 裡面來登入、拉取我們前幾天推在 Docker Hub 上的 image 吧!